package org.nf.mvc.param;

import org.nf.mvc.servlet.ParamTypeHandler;
import org.nf.mvc.util.ConvertUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Parameter;
import java.util.Date;

/**
 * @Author : LLH
 * @create 2021/5/26
 * 实体独享类型转换器
 */
public class BeanTypeHandler extends ParamTypeHandler {
    @Override
    protected Object handle(Parameter parameter) {

        try {
            // 获取参数类型
            Class<?> paramType = parameter.getType();

            // 如果是String类型或者是Date类型又或者是基本数据类型的话，直接返回null
            // 让它直接走下一个类型转换器
            if(paramType.equals(String.class) || paramType.equals(Date.class) || paramType.isPrimitive()){
                return null;
            }

            // 根据参数类型创建实例
            Object instance = paramType.newInstance();

            // 获取对象实体的所有私有字段
            Field[] fields = paramType.getDeclaredFields();
            for (Field field : fields) {
                // 打开访问开关
                field.setAccessible(true);
                // 获取字段类型
                Class<?> fieldType = field.getType();
                // 获取字段名称
                String fieldName = field.getName();
                // 根据字段名称获取请求的数据
                String requestName = request.getParameter(fieldName);
                if(requestName!=null && !"".equals(requestName)){
                    Object value = ConvertUtil.convert(requestName, fieldType);
                    // 将转换后的值复制给Field字段
                    field.set(instance,value);
                }
            }
            return instance;
        } catch (Exception e) {
            return null;
        }

    }
}
